home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / minix / update~3.z / update~3 / lib_fixnum.s < prev    next >
Encoding:
Text File  |  1989-09-05  |  4.7 KB  |  266 lines

  1. #
  2. # /* Subroutines needed by GCC output code on some machines.  */
  3. # /* Compile this file with the Unix C compiler!  */
  4. # #include "config.h"
  5. # union double_di { double d; int i[2]; };
  6. # union flt_or_int { int i; float f; };
  7. # #ifdef WORDS_BIG_ENDIAN
  8. # #define HIGH 0
  9. # #define LOW 1
  10. # #else
  11. # #define HIGH 1
  12. # #define LOW 0
  13. # #endif
  14. # #ifdef L_umulsi3
  15. # _umulsi3 (a, b)
  16. #      unsigned a, b;
  17. # {
  18. #   return a * b;
  19. # }
  20. # #endif
  21.  
  22. .text
  23.     .even
  24. .globl ___umulsi3
  25. .globl __umulsi3
  26. ___umulsi3:
  27. __umulsi3:
  28.     link a6,#0        | 0 bytes of local
  29.     movel d2,sp@-        | push d2
  30.     movel a6@(8),d2        | get a
  31.     beq umul_zero        | 0? return 0
  32.     movel a6@(12),d1    | get b
  33.     beq umul_zero        | 0? return 0
  34.  
  35.     mulu d1,d2        | mul bottom parts
  36.     movel d2,d0        | save that
  37.     movew a6@(8),d2        | get hi part of a
  38.     beq umul_1        | zero, skip it
  39.     movel a6@(12),d1    | get b
  40.     mulu d1,d2        | mul a hi by b lo
  41.     lsll #8,d2        | shift over
  42.     lsll #8,d2        |  ...twice...
  43.     addl d2,d0        | add that in
  44. umul_1:
  45.     clrl d1
  46.     movew a6@(12),d1    | get b hi
  47.     beq umul_ret
  48.     movel a6@(8),d2        | and a lo
  49.     mulu d1,d2        | mult those
  50.     lsll #8,d2        | shift it over
  51.     lsll #8,d2        |  ... twice...
  52.     addl d2,d0        | and add that in
  53.     bra umul_ret        | go home
  54. umul_zero:
  55.     clrl d0            | return 0
  56. umul_ret:
  57.     movel sp@+,d2        | get d2 back
  58.  
  59.     unlk a6            | flush frame
  60.     rts
  61. #
  62. # #ifdef L_mulsi3
  63. # _mulsi3 (a, b)
  64. #      int a, b;
  65. # {
  66. #   return a * b;
  67. # }
  68. # #endif
  69.  
  70. .text
  71.     .even
  72. .globl ___mulsi3
  73. .globl __mulsi3
  74. ___mulsi3:
  75. __mulsi3:
  76.     link a6,#-2        | one word of local
  77.     clrw a6@(-2)        | zap the local; it's our neg flg
  78.  
  79.     movel a6@(12),d0    | get b
  80.     bpl muls1        | pos, ok
  81.     negl d0            | negate it
  82.     addqw #1,a6@(-2)    | and inc the flag
  83. muls1:
  84.     movel d0,sp@-        | push adjusted b
  85.     movel a6@(8),d0        | get a
  86.     bpl muls2        | pos, ok
  87.     negl d0            | negate it
  88.     subqw #1,a6@(-2)    | and dec the flag
  89. muls2:
  90.     movel d0,sp@-        | push adjusted a
  91.     jbsr ___umulsi3        | do an unsigned mult
  92.     addql #8,sp        | flush args
  93.     tstw a6@(-2)        | flag set?
  94.     beq muls3        | nope, go ahead and return
  95.     negl d0            | negate the result
  96. muls3:
  97.  
  98.     unlk a6            | unlink the frame
  99.     rts            | done!
  100. #
  101. # #ifdef L_udivsi3
  102. # _udivsi3 (a, b)
  103. #      unsigned a, b;
  104. # {
  105. #   return a / b;
  106. # }
  107. # #endif
  108.  
  109. .text
  110.     .even
  111. .globl ___udivsi3
  112. .globl __udivsi3
  113. ___udivsi3:
  114. __udivsi3:
  115.     link a6,#0
  116.  
  117.     movel d2,sp@-        | check our bags
  118.     movel d3,sp@-
  119.     movel d4,sp@-
  120.  
  121.     clrl d0            | d0 will be accum
  122.     movel a6@(8),d1        | d1 is a, dividend
  123.     movel a6@(12),d2    | d2 is b, divisor
  124.     beq udiv_zero        | Woops divide by 0
  125.     movel #1,d3        | get a 1 into bit 0 of bit mask
  126.     movel #31,d4        | d4 is bit num for testing need to sub
  127. udiv_sl:
  128.  
  129.     btst d4,d2        | bit get to top yet?
  130.     bne udiv_sr        | yes, start testing for subtraction
  131.     lsll #1,d3        | shift bitnum left
  132.     lsll #1,d2        | shift divisor left
  133.     bra udiv_sl
  134. udiv_sr:
  135.     cmpl d2,d1        | divisor > dividend?
  136.     beq udiv_sub
  137.     bcs udiv_s
  138. udiv_sub:
  139.     subl d2,d1        | take divisor (shifted) out of dividend
  140.     orl d3,d0        | set this bit in d0
  141.     tstl d1            | anything left?
  142.     beq udiv_done        | nope
  143. udiv_s:
  144.     subql #1,d4        | dec bitnum (new only)
  145.     lsrl #1,d2        | shift right one
  146.     lsrl #1,d3        | and the bitnum too
  147.     bne udiv_sr        | more bits, keep dividing
  148.     bra udiv_done
  149. udiv_zero:
  150.     clrl d0            | just return 0
  151. udiv_done:
  152.     movel sp@+,d4
  153.     movel sp@+,d3        | get bags back
  154.     movel sp@+,d2
  155.  
  156.     unlk a6
  157.     rts
  158. #
  159. # #ifdef L_divsi3
  160. # _divsi3 (a, b)
  161. #      int a, b;
  162. # {
  163. #   return a / b;
  164. # }
  165. # #endif
  166.  
  167. .text
  168.     .even
  169. .globl ___divsi3
  170. .globl __divsi3
  171. ___divsi3:
  172. __divsi3:
  173.     link a6,#-2        | 2 bytes of local
  174.     clrw a6@(-2)        | zap the local; it's our neg flg
  175.  
  176.     movel a6@(12),d0    | get b
  177.     bge divs1        | pos, ok
  178.     negl d0            | negate it
  179.     addqw #1,a6@(-2)    | and inc the flag
  180. divs1:
  181.     movel d0,sp@-        | push adjusted b
  182.     movel a6@(8),d0        | get a
  183.     bge divs2        | pos, ok
  184.     negl d0            | negate it
  185.     subqw #1,a6@(-2)    | and dec the flag
  186. divs2:
  187.     movel d0,sp@-        | push adjusted a
  188.     jbsr ___udivsi3        | do an unsigned div
  189.     addql #8,sp        | flush args
  190.     tstw a6@(-2)        | flag set?
  191.     beq divs3        | nope, go ahead and return
  192.     negl d0            | negate the result
  193. divs3:
  194.  
  195.     unlk a6            | unlink the frame
  196.     rts            | done!
  197. #
  198. # #ifdef L_umodsi3
  199. # _umodsi3 (a, b)
  200. #      unsigned a, b;
  201. # {
  202. #   return a % b;
  203. # }
  204. # #endif
  205.  
  206. .text
  207.     .even
  208. .globl ___umodsi3
  209. .globl __umodsi3
  210. ___umodsi3:
  211. __umodsi3:
  212.     link a6,#-4
  213.     movl d2,sp@-
  214.     movel a6@(12),sp@-
  215.     movel a6@(8),sp@-
  216.     jbsr ___udivsi3
  217.     movel d0,d0
  218.     movel a6@(12),sp@-
  219.     movel d0,sp@-
  220.     jbsr ___mulsi3
  221.     movel d0,d2
  222.     movel a6@(8),d1
  223.     subl d2,d1
  224.     movel d1,a6@(-4)
  225.     movel a6@(-4),d0
  226.     movl a6@(-8),d2
  227.     unlk a6
  228.     rts
  229. # #ifdef L_modsi3
  230. # _modsi3 (a, b)
  231. #      int a, b;
  232. # {
  233. #   return a % b;
  234. # }
  235. # #endif
  236.  
  237. .text
  238.     .even
  239. .globl ___modsi3
  240. .globl __modsi3
  241. ___modsi3:
  242. __modsi3:
  243.     link a6,#-4
  244.     movl d2,sp@-
  245.     movel a6@(12),sp@-
  246.     movel a6@(8),sp@-
  247.     jbsr ___divsi3
  248.     movel d0,d0
  249.     movel a6@(12),sp@-
  250.     movel d0,sp@-
  251.     jbsr ___mulsi3
  252.     movel d0,d2
  253.     movel a6@(8),d1
  254.     subl d2,d1
  255.     movel d1,a6@(-4)
  256.     movel a6@(-4),d0
  257.     movl a6@(-8),d2
  258.     unlk a6
  259.     rts
  260.  
  261.